const {promisify} = require('util')  // 可以讲download库的回调函数转换为promise
const download = promisify(require('download-git-repo'))
const {vueRepo} = require('../config/repo')
const {commandSpawn} = require('../utils/terminal')
const {compiler,writeToFile} = require('../utils/compileEjs')
const createProject = async function (project, other) {
  console.log('ylz is creating your project')
  // 1. 下载项目,第一个参数是仓库地址，第二个参数是下载到哪一个目录下，第三个是否以clone的方式下载
  await download(vueRepo,project,{clone:true})

  // 2. 执行npminstall
  console.log('run : npm install')
  // 如果是Windows环境下，使用npm.cmd方法
  const command = process.platform==='win32'?'npm.cmd':'npm'
  // 第一个参数是命名，第二个参数是数组，第三个参数是配置项
  await commandSpawn(command,['install'],{cwd:`./${project}`})

  // 3. 运行npm run serve
  console.log('run : npm run serve')
  // 运行npm run serve会暂停之后的进程，因此不需要使用await
  commandSpawn(command,['run','serve'],{cwd:`./${project}`})
  // 4. 打开浏览器,,打开浏览器可以在webpack中配置，或者使用open库，或者使用终端命令的方式，这里不做操作了
}

const addCpn =async function(name,dest){
  // 组装data
  const data = {name,lowername:name.toLowerCase()}
  
  // 1. 编译ejs模板，获取结果
  const res = await compiler('vue-component.ejs',data)
  // console.log(res)
  // 2. 将结果转换为vue文件写入到对应路径
  const targetPath = `${dest}/${name}.vue`
  writeToFile(targetPath,res)

}

module.exports = {
  createProject,
  addCpn
}